/**
 * 用户管理模块
 * 提供用户信息更新相关功能
 */

module.exports = {
	/**
	 * 更新用户信息（带用户名唯一性验证）
	 * @param {Object} params 更新参数
	 * @param {string} params.username 新用户名
	 * @param {string} params.nickname 昵称
	 * @param {Object} params.avatar_file 头像文件
	 * @returns {Promise<Object>}
	 */
	async updateUser(params = {}) {
		const { username, nickname, avatar_file } = params
		const userId = this.getUniIdToken().uid
		
		if (!userId) {
			return {
				errCode: 'TOKEN_INVALID',
				errMsg: '用户未登录'
			}
		}
		
		// 如果要更新用户名，先验证唯一性
		if (username) {
			// 验证用户名格式
			const usernameRegex = /^[a-zA-Z0-9_]{3,20}$/
			if (!usernameRegex.test(username)) {
				return {
					errCode: 'INVALID_USERNAME',
					errMsg: '用户名格式不正确，只能包含字母、数字和下划线，长度3-20个字符'
				}
			}
			
			// 检查用户名唯一性
			const db = uniCloud.database()
			const dbCmd = db.command
			
			const existingUser = await db.collection('uni-id-users')
				.where({
					username: dbCmd.eq(username),
					_id: dbCmd.neq(userId)
				})
				.count()
			
			if (existingUser.total > 0) {
				return {
					errCode: 'USERNAME_EXISTS',
					errMsg: '该用户名已被使用，请更换'
				}
			}
		}
		
		// 调用 uni-id 的更新方法
		const updateData = {}
		if (username !== undefined) updateData.username = username
		if (nickname !== undefined) updateData.nickname = nickname
		if (avatar_file !== undefined) updateData.avatar_file = avatar_file
		
		try {
			const result = await this.uniIdCommon.updateUser({
				uid: userId,
				...updateData
			})
			
			return result
		} catch (error) {
			console.error('更新用户信息失败:', error)
			
			// 捕获数据库唯一索引冲突错误
			if (error.message && error.message.includes('E11000')) {
				if (error.message.includes('username')) {
					return {
						errCode: 'USERNAME_EXISTS',
						errMsg: '该用户名已被使用，请更换'
					}
				}
			}
			
			return {
				errCode: 'UPDATE_USER_FAILED',
				errMsg: '更新用户信息失败: ' + error.message
			}
		}
	},
	
	/**
	 * 检查用户名是否可用
	 * @param {string} username 要检查的用户名
	 * @returns {Promise<Object>}
	 */
	async checkUsernameAvailable(username) {
		if (!username) {
			return {
				errCode: 'INVALID_PARAM',
				errMsg: '用户名不能为空'
			}
		}
		
		// 验证格式
		const usernameRegex = /^[a-zA-Z0-9_]{3,20}$/
		if (!usernameRegex.test(username)) {
			return {
				errCode: 'INVALID_USERNAME',
				errMsg: '用户名格式不正确',
				available: false
			}
		}
		
		const userId = this.getUniIdToken()?.uid
		const db = uniCloud.database()
		const dbCmd = db.command
		
		const where = { username: dbCmd.eq(username) }
		// 如果已登录，排除当前用户
		if (userId) {
			where._id = dbCmd.neq(userId)
		}
		
		const result = await db.collection('uni-id-users')
			.where(where)
			.count()
		
		return {
			errCode: 0,
			available: result.total === 0,
			errMsg: result.total > 0 ? '用户名已被使用' : '用户名可用'
		}
	}
}
